#include "./../../../include/online/Reactor/InetAddress.h"
#include <string.h>

// 构造函数：根据IP地址和端口号初始化
InetAddress::InetAddress(const string &ip, unsigned short port)
{
    memset(&_addr, 0, sizeof(_addr));  // 初始化_addr结构体，将所有字节置为0
    _addr.sin_family = AF_INET;  // 设置地址族为IPv4（AF_INET）

    // 将IP地址从字符串转换为网络字节序
    _addr.sin_addr.s_addr = inet_addr(ip.c_str());  // 将字符串IP地址转换为网络字节序的32位地址

    // 将端口号从主机字节序转换为网络字节序
    _addr.sin_port = htons(port);  // htons()将端口号转换为网络字节序
}

// 另一个构造函数：通过一个已经存在的sockaddr_in结构体进行初始化
InetAddress::InetAddress(const struct sockaddr_in &addr)
: _addr(addr)  // 使用初始化列表将传入的sockaddr_in结构体复制给成员变量_addr
{

}

// 析构函数：该类没有动态分配内存，所以不需要做特别的资源释放工作
InetAddress::~InetAddress()
{

}

// 获取客户端的IP地址：返回IP地址的字符串形式
string InetAddress::ip() const
{
    // 将网络字节序的IP地址转换为点分十进制字符串
    return string(inet_ntoa(_addr.sin_addr));  // inet_ntoa()将网络字节序的IP地址转换为字符串格式
}

// 获取客户端的端口号：返回端口号
unsigned short InetAddress::port() const
{
    // 将网络字节序的端口号转换为主机字节序
    return ntohs(_addr.sin_port);  // ntohs()将端口号从网络字节序转换为主机字节序
}

// 获取_sockaddr_in结构体的指针
const struct sockaddr_in *InetAddress::getInetAddressPtr() const
{
    return &_addr;  // 返回_addr成员变量的地址
}
